import axios from 'axios';
import io from 'socket.io-client';

const socket = io('ws://localhost:9093');

// 获取聊天列表
const MSG_LIST = 'MSG_LIST';
//读取信息
const MSG_RECV = 'MSG_RECV';
//标识已读
const MSG_READ = 'MSG_READ';

const initState = {
    chatmsg: [],
    users: {},
    unread: 0
};

export function chat(state = initState, action) {
    switch (action.type) {
        case MSG_LIST:
            return {...state, chatmsg: action.payload.msgs,users: action.payload.users,
                unread: action.payload.msgs.filter(v => !v.read&&v.to === action.payload.userid).length};
        case MSG_RECV:
            const n = action.payload.to === action.payload.userid ? 1 : 0;
            return {...state, chatmsg: [...state.chatmsg, action.payload], unread: state.unread + n};
        case MSG_READ:
            const {from, num} = action.payload;
            const m = state.unread - num < 0 ? 0 : state.unread - num;
            return {...state, chatmsg: state.chatmsg.map(v=>({...v, read: from === v.from ? true: v.read})), unread: m};
        default:
            return state;
    }
}

function msgRecv(msg, userid) {
    return {type: MSG_RECV, payload: msg, userid};
}

function msgList(msgs, users, userid) {
    return {type: MSG_LIST, payload: {msgs, users, userid}};
}

function msgRead({from, userid, num}) {
    return {type: MSG_READ, payload: {from, userid, num}}
}

export function recvMsg() {
    return (dispatch, getState)=>{
        socket.on('recvMsg', function (data) {
            const userid = getState().user._id;
            dispatch(msgRecv(data, userid));
        })
    }
}

export function getMsgList() {
    return (dispatch, getState) => {
        axios.get('/user/getMsgList').then(res=>{
            if(res.status === 200 && res.data.code===0) {
                // console.log('getState', getState());
                const userid = getState().user._id;
                dispatch(msgList(res.data.msgs, res.data.users, userid));
            }
        })
    }
}

export function sendMsg({from, to, msg}) {
    return dispatch => {
        socket.emit('sendMsg', {from, to, msg});
    }
}

export function readMsg(from){
    return (dispatch, getState) => {
        axios.post('/user/readmsg', {from}).then(res => {
            const userid = getState().user._id;
            if(res.status === 200 && res.data.code ===0) {
                dispatch(msgRead({userid, from , num: res.data.num}));
            }
        })
    }
}
